home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgramD2.iso / Borland / Borland C++ V5.02 / GDIPAL.PAK / STATBAR.C < prev    next >
C/C++ Source or Header  |  1997-05-06  |  9KB  |  312 lines

  1. // THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
  2. // ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
  3. // THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
  4. // PARTICULAR PURPOSE.
  5. //
  6. // Copyright (C) 1993 - 1995  Microsoft Corporation.  All Rights Reserved.
  7. //
  8. //  MODULE: statbar.c
  9. //
  10. //  PURPOSE: Handles general routines for the Barsdi sample.
  11. //
  12. //  FUNCTIONS:
  13. //    MsgTimer      - Handles the WM_TIMER messages to set the time on
  14. //                    the status bar.
  15. //    MsgMouseMove  - Moved to CLIENT.C
  16. //    MsgMenuSelect - Handle the WM_MENUSELECT message. This message will
  17. //                    enable the status bar control to update when the user
  18. //                    moves across menu items on the main window.
  19. //    InitializeStatusBar - Sets the pane positions in the statusbar control
  20. //    CreateSBar    - Calls CreateStatusWindow() to create the status bar
  21. //    UpdateStatusBar - Updates the statusbar control with appropriate text
  22. //
  23.  
  24. #include <windows.h>            // required for all Windows applications
  25. #include <windowsx.h>
  26. #include <commctrl.h>           // prototypes and defs for common controls
  27. #include "globals.h"            // prototypes specific to this application
  28. #include "statbar.h"            // prototypes specific to statbar.c
  29.  
  30.             
  31. // Global Variables for the status bar control.
  32.  
  33. HWND  hWndStatusbar;
  34.  
  35. //  **TODO**  Add entries to the string table in barsdi.rc for each menu
  36. //            command.  MsgMenuSelect (below) loads these strings to display
  37. //            information in the status bar.  MsgMenuSelect assumes that the
  38. //            string ID is the same as the command ID and that a string
  39. //            exists for every command.
  40. //
  41. // The following array contains resource string ID's for popup menus
  42. // in the main application menu.  This array is used by MsgMenuSelect
  43. // to display information in the status bar.
  44. //
  45. //  **TODO**  Add entries to this array for each popup menu in the same
  46. //            positions as they appear in the main menu.  Remember to define
  47. //            the ID's in globals.h and add the strings to barsdi.rc.
  48.  
  49. UINT idPopup[] =
  50. {
  51.     IDM_FILEMENU,    
  52.     IDM_INFO,
  53. //    IDM_EDITMENU,
  54.     IDM_DRAWMENU,
  55.     IDM_HELPMENU,
  56. };
  57.  
  58.  
  59. //
  60. //  FUNCTION: MsgTimer(HWND, UINT, WPARAM, LPARAM)
  61. //
  62. //  PURPOSE: Calls GetLocalTime() to set the time on the status bar
  63. //
  64. //
  65. //  PARAMETERS:
  66. //
  67. //    hwnd      - Window handle  (Unused)
  68. //    uMessage  - Message number (Unused)
  69. //    wparam    - Extra data     (Unused)
  70. //    lparam    - Extra data     (Unused)
  71. //
  72. //  RETURN VALUE:
  73. //
  74. //    Always returns 0 - Message handled
  75. //
  76. //  COMMENTS:
  77. //
  78. //    Every time the window procedure receives a Timer message, it calls
  79. //    GetLocalTime() to obtain the time and then formats the time into
  80. //    a string. The time sting is then displayed on the status bar.
  81. //
  82.  
  83. #pragma argsused
  84. LRESULT MsgTimer(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  85. {
  86.     char        szBuf[16];      // Temp buffer.
  87.     SYSTEMTIME  sysTime;
  88.  
  89.  
  90.     GetLocalTime(&sysTime);
  91.  
  92.     wsprintf(szBuf,
  93.              "%2d:%02d:%02d %s",
  94.              (sysTime.wHour == 0 ? 12 :
  95.              (sysTime.wHour <= 12 ? sysTime.wHour : sysTime.wHour -12)),
  96.              sysTime.wMinute,
  97.              sysTime.wSecond,
  98.              (sysTime.wHour < 12 ? "AM":"PM"));
  99.  
  100.     UpdateStatusBar(szBuf, 4, 0);
  101.     return 0;
  102. }
  103.  
  104.  
  105. //
  106. //  FUNCTION: MsgMenuSelect(HWND, UINT, WPARAM, LPARAM)
  107. //
  108. //  PURPOSE:  Upadates menu selections on the staus bar.
  109. //
  110. //
  111. //  PARAMETERS:
  112. //
  113. //    hwnd      - Window handle  (Used)
  114. //    uMessage  - Message number (Used)
  115. //    wparam    - Extra data     (Used)
  116. //    lparam    - Extra data     (Used)
  117. //
  118. //  RETURN VALUE:
  119. //
  120. //    Always returns 0 - Message handled
  121. //
  122. //  COMMENTS:
  123. //    This message is sent when the user selects menu items by
  124. //    by pulling down  a popup menu move the mouse around to highlite
  125. //    different menu items.
  126. //
  127. //
  128.  
  129. #pragma argsused
  130. LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
  131. {
  132.      static char szBuffer[128];
  133.      UINT   nStringID;
  134.      UINT   fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
  135.      UINT   uCmd    = GET_WM_MENUSELECT_CMD(wparam, lparam);
  136.      HMENU  hMenu   = GET_WM_MENUSELECT_HMENU(wparam, lparam);
  137.  
  138.  
  139.      szBuffer[0] = 0;                            // First reset the buffer
  140.  
  141.  
  142.      if (fuFlags == 0xffff && hMenu == NULL)     // Menu has been closed
  143.           nStringID = IDS_DESCRIPTION;
  144.  
  145.      else if (fuFlags & MFT_SEPARATOR)           // Ignore separators
  146.           nStringID = 0;
  147.  
  148.      else if (fuFlags & MF_POPUP)                // Popup menu
  149.      {
  150.           if (fuFlags & MF_SYSMENU)               // System menu
  151.                 nStringID = IDS_SYSMENU;
  152.  
  153.           else
  154.                 // Get string ID for popup menu from idPopup array.
  155.                 nStringID = ((uCmd < sizeof(idPopup)/sizeof(idPopup[0])) ?
  156.                                      idPopup[uCmd] : 0);
  157.      }  // for MF_POPUP
  158.  
  159.      else                                        // Must be a command item
  160.           nStringID = uCmd;                       // String ID == Command ID
  161.  
  162.      // Load the string if we have an ID
  163.     if (0 != nStringID)
  164.         LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
  165.  
  166.     // Finally... send the string to the status bar
  167.     UpdateStatusBar(szBuffer, 0, 0);
  168.  
  169.      return 0;
  170. }
  171.  
  172.  
  173. //
  174. //  FUNCTION: InitializeStatusBar(HWND)
  175. //
  176. //  PURPOSE:  Initialize statusbar control with time and mouse positions.
  177. //
  178. //
  179. //  PARAMETERS:
  180. //
  181. //  hwndParent - Window handle of the status bar's parent
  182. //
  183. //
  184. //  RETURN VALUE:  NONE
  185. //
  186. //
  187. //  COMMENTS:
  188. //
  189. //   This function initializes the time  and mouse positions sections of
  190. //   the statubar window. The Date for the time section is obtained by
  191. //   calling SetTimer API. When the timer messages start comming in,
  192. //   GetSytemTime() to fill the time section.
  193. //   The WPARAM of SB_SETTEXT is divided into 2 parameters. The LOWORD
  194. //   determines which section/part the text goes into, and the HIWORD
  195. //   tells how the bar is drawn (popin or popout).
  196. //
  197.  
  198. void InitializeStatusBar(HWND hwndParent)
  199. {
  200.     const cSpaceInBetween = 8;
  201.     int   ptArray[5];   // Array defining the number of parts/sections
  202.     SIZE  size;         // the Status bar will display.
  203.     RECT  rect;
  204.     HDC   hDC;
  205.  
  206.    /*
  207.     * Fill in the ptArray...
  208.     */
  209.  
  210.     hDC = GetDC(hwndParent);
  211.     GetClientRect(hwndParent, &rect);
  212.  
  213.     ptArray[4] = rect.right;
  214.  
  215.     if (GetTextExtentPoint(hDC, "00:00:00 PM", 12, &size))
  216.         ptArray[3] = ptArray[4] - (size.cx) - cSpaceInBetween;
  217.     else
  218.         ptArray[3] = 0;
  219.  
  220.     if (GetTextExtentPoint(hDC, "Time:", 6, &size))
  221.         ptArray[2] = ptArray[3] - (size.cx) - cSpaceInBetween;
  222.     else
  223.         ptArray[2] = 0;
  224.  
  225.     if (GetTextExtentPoint(hDC, "123,123", 8, &size))
  226.         ptArray[1] = ptArray[2] - (size.cx) - cSpaceInBetween;
  227.     else
  228.         ptArray[1] = 0;
  229.  
  230.     if (GetTextExtentPoint(hDC, "Cursor Pos:", 12, &size))
  231.         ptArray[0] = ptArray[1] - (size.cx) - cSpaceInBetween;
  232.     else
  233.         ptArray[0] = 0;
  234.  
  235.     ReleaseDC(hwndParent, hDC);
  236.  
  237.     SendMessage(hWndStatusbar,
  238.                 SB_SETPARTS,
  239.                 sizeof(ptArray)/sizeof(ptArray[0]),
  240.                 (LPARAM)(LPINT)ptArray);
  241.  
  242.     UpdateStatusBar(SZDESCRIPTION, 0, 0);
  243.     UpdateStatusBar("Cursor Pos:", 1, SBT_POPOUT);
  244.     UpdateStatusBar("Time:", 3, SBT_POPOUT);
  245. }
  246.  
  247.  
  248. //
  249. //  FUNCTION: CreateSBar(HWND, UINT, WPARAM, LPARAM)
  250. //
  251. //  PURPOSE:  Calls CreateStatusWindow() to create the status bar
  252. //
  253. //
  254. //  PARAMETERS:
  255. //
  256. //  hwndParent - Window handle of the status bar's parent
  257. //
  258. //  RETURN VALUE:
  259. //
  260. //  If both controls were created successfully Return TRUE,
  261. //  else returns FALSE.
  262. //
  263. //  COMMENTS:
  264. //
  265. //
  266.  
  267. BOOL CreateSBar(HWND hwndParent)
  268. {
  269.     hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER,
  270.                                        SZDESCRIPTION,
  271.                                        hwndParent,
  272.                                        IDM_STATUSBAR);
  273.     if(hWndStatusbar)
  274.     {
  275.         InitializeStatusBar(hwndParent);
  276.         SetTimer(hwndParent, IDM_TIMER, TIMER_TIMEOUT, NULL);
  277.         return TRUE;
  278.     }
  279.  
  280.     return FALSE;
  281. }
  282.  
  283.  
  284. //
  285. //  FUNCTION: UpdateStatusBar(HWND)
  286. //
  287. //  PURPOSE:  Updates the statusbar control with appropriate text
  288. //
  289. //
  290. //  PARAMETERS:
  291. //
  292. //  lpszStatusString - text to be displayed
  293. //  partNumber       - which part of the status bar to display text in
  294. //  displayFlags     - display flags
  295. //
  296. //
  297. //  RETURN VALUE: NONE
  298. //
  299. //
  300. //  COMMENTS:
  301. //      None
  302. //
  303. //
  304.  
  305. void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
  306. {
  307.     SendMessage(hWndStatusbar,
  308.                 SB_SETTEXT,
  309.                 partNumber | displayFlags,
  310.                 (LPARAM)lpszStatusString);
  311. }
  312.